
#include "const.h"
#include "console.h"
#include "types.h"
#include "ident.h"


static int currentUID = -1;

#define SEG_SAUV_CURRENT 0x9998		// 0x9998 mémoire problablement non utilisé
#define SEG_SAUV_LIST 0x9999		// 0x9999 mémoire problablement non utilisé

void getStringIdent(char *bufId) 
{
	char car =0; int i=0;
	while (car != RETURN) {
		car = readChar();
		printChar(car);
		bufId[i++] = car;
		if (car == BACKSPACE) 
		{
			printChar(' ');
			printChar(BACKSPACE);		// retour en arrière du curseur
			bufId[i--] = 0;
			if (i)						// si i est positif
				i--;
			else
				printChar(' ');			// empeche que le curseur ai trop loin
		}
	}
	bufId[i-1] = 0;
}


int init(void) 
{
	typedef struct {
		uint UID;
		char login[40];
		char passwd[40];
	} ident;
	ident table_ident[256];
	char buf[5000],login[100],passwd[100],loginOK=0,passwdOK=0;
	int i=0,j=0,k=0,l=0,t=0,nbUsr=0;
	
	while(t<5000)
		buf[t++] =0;							// clear buffer (erreur affichage shell)
/*
**		Lecture du fichier ident.txt placement dans une structure
*/

	readFile("ident.txt",buf);
	t=0;
	while (buf[i])								// lecture fichier ident et mise en structure
	{   
		table_ident[j].login[k] = buf[i];
		memPutB(SEG_SAUV_LIST + t,k++, buf[i]);
		if (buf[i] == ' ')
		{
			table_ident[j].UID = j;
			table_ident[j].login[k-1] = 0;			// ferme chaine 
			memPutB(SEG_SAUV_LIST,k,0);		// terminaison chaine
			i++;
			while(buf[i] != '\n')
				table_ident[j].passwd[l++] = buf[i++];
			table_ident[j].passwd[l] =0;
			nbUsr = j; j++;
			k=0; l=0; t++;
		} 
		i++;
	}

	while(!loginOK & !passwdOK) 
	{	
		printString("\nLogin: ");
		getStringIdent(login);
		printString("\nPassword: ");
		getStringIdent(passwd);
	
		for(i=0;i<=nbUsr;i++)				// Test d'authentification
		{
			if (strcmp(table_ident[i].login,login)) 
			{
				loginOK =1;
				if (strcmp(table_ident[i].passwd,passwd)) {
					passwdOK =1;
					memPutB(SEG_SAUV_CURRENT,0,i);		// sauvegarde ID pour le passer au SHELL
				}									
				else
					loginOK =0;
			}
			j=0;k=0;
		}
	}
}

int getCurrentUID()							// pour changer de segment (kernel segment 1000, shell 2000)
{
	return memGetB(SEG_SAUV_CURRENT,0);				// une variable globale n'est pas possible
}											

int getCurrentLogin(char *login)
{
	char car= 0;
	int i=1,j=0;
	while (car = memGetB(SEG_SAUV_CURRENT,i++)) 
		*login++ = car;
	*login = 0;
	return 0;
}
	
int getLogin(int uid ,char *login)
{	
	char car= 0;
	int i=0;
	
	while (car = memGetB(SEG_SAUV_LIST+uid,i++)) 
	{	
		*login++ = car;
	}
	*login = 0;
	return 0;
}
	
	
		

 
